package bat.iog.hytool.excel;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import iog.hytool.excel.Excel.Type;

public class ExcelBean<T> {
/*    *//**
     * 导出类的对象
     *//*
    public T t;*/
    /**
     * 实体bean对象
     */
    public Class<T> clazz;
    /**
     * 导入导出数据列表
     */
    public List<T> list;
    /**
     * 导入导出文件名
     */
    public String fileNmae;
    /**
     * sheet名
     */
    public String sheetName;
    /**
     * 注解列表字段
     */
    public List<Object[]> fields;
    /**
     * 导出类型（EXPORT:导出数据；IMPORT：导入模板）
     */
    public Type type;
    
    public String downloadPath;
    
    /**
     * 获取下载路径
     *
     * @param filename 文件名称
     */
    public String getAbsoluteFile(String filename)
    {
        String path = downloadPath + filename;
        File desc = new File(path);
        if (!desc.getParentFile().exists())
        {
            desc.getParentFile().mkdirs();
        }
        return path;
    }
    
    /**
     * 设置注解列表字段
     */
    private void setExcelField() {
        this.fields = new ArrayList<Object[]>();
        List<Field> tempFields = new ArrayList<>();
        //获取父类中的所有字段
        tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
        //获取类中的所有字段
        tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
        for (Field field : tempFields) {
            // 单注解
            if (field.isAnnotationPresent(Excel.class)) {
                putToField(field, field.getAnnotation(Excel.class));
            }

            // 多注解
            /*if (field.isAnnotationPresent(Excels.class)) {
                Excels attrs = field.getAnnotation(Excels.class);
                Excel[] excels = attrs.value();
                for (Excel excel : excels) {
                    putToField(field, excel);
                }
            }*/
        }
    }
    
    /**
     * 放到字段集合中
     */
    private void putToField(Field field, Excel attr) {
        if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) {
            this.fields.add(new Object[] { field, attr });
        }
    }

    /**
     * 获取bean中的相应属性值
     *
     * @param vo 实体对象
     * @param field 字段
     * @param excel 注解
     * @return 最终的属性值
     * @throws Exception
     */
    public Object getTargetValue(T vo, Field field, Excel excel) throws Exception {
        Object o = field.get(vo);
        if (excel.targetAttr() != null && excel.targetAttr() != "") {
            String target = excel.targetAttr();
            if (target.indexOf(".") > -1) {
                String[] targets = target.split("[.]");
                for (String name : targets) {
                    o = getValue(o, name);
                }
            } else {
                o = getValue(o, target);
            }
        }
        return o;
    }

    /**
     * 以类的属性的get方法方法形式获取值
     *
     * @param o
     * @param name
     * @return value
     * @throws Exception
     */
    public Object getValue(Object o, String name) throws Exception {
        if (name != null && !name.equals("")) {
            Class<?> clazz = o.getClass();
            String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
            Method method = clazz.getMethod(methodName);
            o = method.invoke(o);
        }
        return o;
    }
    
    
}
